package com.yf.gc.g1;

import java.util.UUID;

/*
验证结论：
如果配置了XX:G1HeapRegionSize，那么以配置为准；否则以计算为准:
 */
public class HeapRegionSizeTest {
    /*
    -XX:+UseG1GC -verbose:gc -Xmx6144m -Xms2048m -XX:+PrintHeapAtGC
     */
    public static void main(String[] args) throws Exception {
        for (int i=0; i<Integer.MAX_VALUE; i++){
            // 利用UUID不断生成字符串，这些字符串都会在堆中分配，导致不断塞满Eden区引起YoungGC
            UUID.randomUUID().toString();
            if (i>=100000 && i%100000==0){
                System.out.println("i="+i);
                Thread.sleep(3000);
            }
        }
        Thread.sleep(3000);
    }

    /*
    通过上面的分析可知G1垃圾回收时JVM分配REGION的SIZE有如下要求：
    1、如果配置了-XX:G1HeapRegionSize，那么先以配置的值为准；否则以计算为准；
    2、根据第一步计算得到的REGION_SIZE，取不能大于它的最大的2^n的值为第二步计算得到的REGION_SIZE的值
    3、把第二步计算得到的REGION_SIZE和MIN_REGION_SIZE比较，
    如果比MIN_REGION_SIZE还小，那么MIN_REGION_SIZE就是最终的region_size；
    否则再把REGION_SIZE和MAX_REGION_SIZE比较，如果比MAX_REGION_SIZE还大，那么MAX_REGION_SIZE就是最终的region_size；
    如果REGION_SIZE在[MIN_REGION_SIZE, MAX_REGION_SIZE]之间，那么REGIOIN_SIZE就是最终的region_size；
     */
}
